package practice5;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 本题核心：
 * 1、使用二进制展开中的“1”来表示有该口味的糖果,通过“|”运算实现糖果的口味的增减
 * 2、使用dp[i]表示i展开后对应的口味组合所需的最少包数,并进行状态转移
 *
 */
public class P8687 {
    public static void main(String[] args) {
        int[] dp=new int[1<<20];    //用二进制的1表示有该种类的糖果,dp[i]表示平常i对应的口味数需要的最少包数
        int[] St=new int[101];       //用二进制的1表示每包糖果有的口味数
        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        int k=sc.nextInt();
        int total=(1<<m)-1;        //全部口味的组合方式
        Arrays.fill(dp,-1);
        for(int i=0;i<n;i++){
            int st=0;
            for(int j=0;j<k;j++){
                int x=sc.nextInt();
                st|=1<<(x-1);       //用二进制中的1表示有该口味的糖果
            }
            dp[st]=1;           //该口味组合就是该包糖果
            St[i+1]=st;
        }
        //遍历所有口味组合
        for(int i=1;i<=total;i++){
            if(dp[i]!=-1){
                //说明有该种组合，遍历所有包
                for(int j=1;j<=n;j++){
                    int st=St[j];   //每包糖果的口味组合
                    if(dp[i|st]==-1 || dp[i|st]>=dp[i]+1){
                        //新生成的口味组合不存在，或新生成的口味组合更优
                        //进行装填转移
                        dp[i|st]=dp[i]+1;
                    }
                }
            }
        }
        System.out.println(dp[total]);
    }
}
